Some cursor work for csw(win32), more left to do
authorHans Breuer <hans@breuer.org>
Sun, 26 Jul 2009 17:08:49 +0000 (19:08 +0200)
committerHans Breuer <hans@breuer.org>
Sun, 26 Jul 2009 17:14:06 +0000 (19:14 +0200)
gdk/win32/gdkevents-win32.c
gdk/win32/gdkwindow-win32.c

index 2cc4910ec6cdcd5412c8b5692c1e8fb69fa9c856..9a3c9190b5b996dca486cb5bca80a3deb3b53705 100644 (file)
@@ -474,9 +474,52 @@ _gdk_windowing_pointer_grab (GdkWindow    *window,
                             GdkCursor    *cursor,
                             guint32    time)
 {
-  SetCapture (GDK_WINDOW_HWND (native_window));
-  /* TODO_CSW: grab brokens, confine window, cursor, input_grab */
-  return GDK_GRAB_SUCCESS;
+  HCURSOR hcursor;
+  GdkCursorPrivate *cursor_private;
+  gint return_val;
+
+  g_return_val_if_fail (window != NULL, 0);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
+  g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
+  
+  cursor_private = (GdkCursorPrivate*) cursor;
+  
+  if (!cursor)
+    hcursor = NULL;
+  else if ((hcursor = CopyCursor (cursor_private->hcursor)) == NULL)
+    WIN32_API_FAILED ("CopyCursor");
+
+  return_val = _gdk_input_grab_pointer (native_window,
+                                       owner_events,
+                                       event_mask,
+                                       confine_to,
+                                       time);
+
+  if (return_val == GDK_GRAB_SUCCESS)
+    {
+      GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) native_window)->impl);
+
+      SetCapture (GDK_WINDOW_HWND (native_window));
+      /* TODO_CSW: grab brokens, confine window, input_grab */
+      if (p_grab_cursor != NULL)
+       {
+         if (GetCursor () == p_grab_cursor)
+           SetCursor (NULL);
+         DestroyCursor (p_grab_cursor);
+       }
+
+      p_grab_cursor = hcursor;
+
+      if (p_grab_cursor != NULL)
+       SetCursor (p_grab_cursor);
+      else if (impl->hcursor != NULL)
+       SetCursor (impl->hcursor);
+      else
+       SetCursor (LoadCursor (NULL, IDC_ARROW));
+
+    }
+
+  return return_val;
 }
 
 void
index de709ac6b2710062f4756f3746f1d8635855c036..d3414495d411ed40e2810cdb11e8b777ee1e691e 100644 (file)
@@ -1928,7 +1928,8 @@ gdk_win32_window_set_cursor (GdkWindow *window,
     {
       /* If the pointer is over our window, set new cursor */
       GdkWindow *curr_window = gdk_window_get_pointer (window, NULL, NULL, NULL);
-      if (curr_window == window)
+      if (curr_window == window ||
+         (curr_window && window == gdk_window_get_toplevel (curr_window)))
         SetCursor (impl->hcursor);
       else
        {